/***********************************************
 **** 版权声明处 **
 ****  为了方便阅读和维护，请严格遵守相关代码规范，谢谢   ****
 *******************************************/
package com.hnisi.board.view
{
	/*******************************************
	 **** huangjixin,2012-6-11,下午4:17:01 **
	 **** 请一句话表述该类主要作用  **
	 *******************************************/
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;
	
	import mx.core.ILayoutElement;
	import mx.core.IVisualElement;
	import mx.core.IVisualElementContainer;
	import mx.events.DragEvent;
	import mx.events.SandboxMouseEvent;
	
	import spark.components.supportClasses.GroupBase;
	import spark.effects.Move;
	import spark.layouts.TileLayout;
	
	public class DashboardLayout extends TileLayout
	{
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// private 类私有静态变量和静态常量声明处。（全部大写，使用下划线进行分割）
		// 例如：private static const EXAMPLE:String = "example";
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// public 类公有静态变量和静态常量声明处。（全部大写，使用下划线进行分割）
		// 例如：public static const EXAMPLE:String = "example";
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// private 私有变量声明处，请以“_”开头定义变量
		// 例如：private var _example:String;
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		private var _currentRenderer:DashBoardItemRenderer;
		private var _currentRect:Rectangle;
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// public 公有变量声明处
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// 构造函数，初始化相关工作可以放在里面
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		public function DashboardLayout()
		{
			super();
		}//构造函数结束
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// getter和setter函数
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// 相关事件响应函数和逻辑函数存放处
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		/**
		 * 拖拽开始； 
		 * @param event
		 * 
		 */
		private function onElDragStart(event:DragEvent):void
		{
			var layoutTarget:GroupBase = target;
			if (!layoutTarget)
				return;
//			layoutTarget.stage.addEventListener(MouseEvent.MOUSE_MOVE,onStageMouseMove);
			
			for (var i:int = 0; i < layoutTarget.numElements; i++) 
			{
				var element:ILayoutElement = layoutTarget.getElementAt(i);
				if(element == event.currentTarget){
					_currentRenderer = element as DashBoardItemRenderer;
					break;
				}
			}
			
		}
		
		/**
		 * 侦听鼠标移动； 
		 * @param event
		 * 
		 */
		protected function onStageMouseMove(event:MouseEvent):void
		{
			var layoutTarget:GroupBase = target;
			if (!layoutTarget)
				return;
			
			layoutTarget.systemManager.getSandboxRoot().addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
			layoutTarget.systemManager.getSandboxRoot().addEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, onMouseUp); 
			
			var currentRect:Rectangle = new Rectangle(_currentRenderer.x,_currentRenderer.y,_currentRenderer.width,_currentRenderer.height);
			var eleRect:Rectangle;
			var dropIndex:Number = -1;
			
			for (var i:int = 0; i < layoutTarget.numElements; i++) 
			{
				var element:IVisualElement = layoutTarget.getElementAt(i);
				eleRect = new Rectangle(element.x,element.y,element.width,element.height);
				if(element != _currentRenderer){
					if(_currentRenderer.hitTestObject(element as DashBoardItemRenderer)){
						var intersection:Rectangle = eleRect.intersection(currentRect);
						
						if ((intersection.width * intersection.height) > (eleRect.width * eleRect.height /2))
						{
							dropIndex = i;
						}
					}
					
				}
			}
			
			if(dropIndex != -1){
				element = layoutTarget.getElementAt(i);
				if(element != _currentRenderer){
					var move:Move = new Move(element);
					move.duration = 1000;
					move.xTo = currentRect.x;
					move.yTo = currentRect.y;

					currentRect.x = element.x;
					currentRect.y = element.y;
					this._currentRect = currentRect;
					move.play();
				}
				
			}

		}
		
		protected function swapElements(ele1:IVisualElement,ele2:IVisualElement):void
		{
			var layoutTarget:GroupBase = target;
			if (!layoutTarget)
				return;
			if(layoutTarget is IVisualElementContainer){
				if(IVisualElementContainer(layoutTarget).getElementIndex(ele1)>-1 &&
					IVisualElementContainer(layoutTarget).getElementIndex(ele1)>-1){
					IVisualElementContainer(layoutTarget).swapElements(ele1,ele2);
				}
			}
		}//swapElements结束
		
		/**
		 * 鼠标弹起，移除事件侦听器； 
		 * @param event
		 * 
		 */
		protected function onMouseUp(event:Event):void
		{
			var layoutTarget:GroupBase = target;
			if (!layoutTarget)
				return;
			layoutTarget.systemManager.getSandboxRoot().removeEventListener(MouseEvent.MOUSE_UP,onMouseUp);
			layoutTarget.systemManager.getSandboxRoot().removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, onMouseUp);
		}
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// override 覆盖函数
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		override public function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
		{
			super.updateDisplayList(unscaledWidth,unscaledHeight);
			var layoutTarget:GroupBase = target;
			if (!layoutTarget)
				return;
			
			//----不支持虚拟布局；
			if (useVirtualLayout){
				return;
			}
			
			var el:ILayoutElement = null;
			for (var index:int = 0; index <= layoutTarget.numElements; index++)
			{
				el = layoutTarget.getElementAt(index);
				if(el is DashBoardItemRenderer){
					el.addEventListener(DragEvent.DRAG_START,onElDragStart);
				}
			}
		}
		
		
	}//类结束
}//包结束